// 通用网络请求，上传，下载
import config from "./config.js";
import util from "./util.js";
import ascribe from "./ascribe.js";
export default { 
	
	// 生成headers
	headers() {
		let _this = this;
		let time = parseInt(new Date().getTime()) + "";
		let oaid = uni.getStorageSync("oaid") || "";
		ascribe.getOAID();
	
		let header = {
			"Content-Type": "application/json",
			"productcode": config.productCode, // 固定标识
			"time": time || "", // 请求时间戳
			"language": config.systemInfo.language || "", // 使用语言
			"ua": config.systemInfo.ua, // UA标识
			
			// #ifdef APP
			"appversion": util.getAppVersion(), // App版本
			"systemtype": config.osName === 1 ? 'ios' : 'android', // 系统类别
			"system": config.systemInfo.system || "", //系统名称如iOS 16
			"packagename": util.getPackageName(), // App包名
			"channel": util.getChannel(), // 渠道号
			"deviceid": (!plus.runtime.isAgreePrivacy() && config.osName === 2) ? util.random_char(30) : config.systemInfo.deviceId, // 设备ID
			"brand": config.systemInfo.brand || "", // 手机品牌
			"version": config.systemInfo.version || "", // 框架引擎版本
			"oaid": (oaid == "0" || oaid == "") ? "" : oaid, // OAID
			// #endif
		};
	
		if (util.token()) {
			// 鉴权token
			header[config.headerToken] = util.token();
		}
		return header;
	},
	
	// 网络请求方法
	async ajax(option) {
		let _this = this;
		if (option.load) {
			util.showLoading();
		}
		
		// 延迟15毫秒，为了防止安卓如小左低端机请求接口太快导致进入新页面的时候渲染白屏闪动
		if(config.osName === 2) await util.setTimeoutSync(15);
		let data = option.data || {};
		for(let i in data){
			if(data[i] == null){
				delete data[i];
			}
		}
		let header = option.header || _this.headers();
		let opt = {
			url: config.api() + option.url,
			data: data,
			method: option.method || "GET",
			header: header,
			timeout: 1000 * 120,
			success: (res) => {
				option.load && util.hideLoading();
				if (res.data.code == 200) {
					option.success && option.success(res.data);
				} else {
					if (res.data.code == 401) {	// 当token过期以后
						util.loginExit();
					}
	
					if (option.error) {
						option.error && option.error(res.data);
					} else {
						util.toast(res.data.msg || "网络错误");
					}
				}
			},
			fail: (res) => {
				option.load && util.hideLoading();
				console.log("[HTTP Response Error]: ", res, config.api() + option.url);
				uni.getNetworkType({
					success(net) {
						if (net.networkType == "none") {
							if (option.error) {
								option.error && option.error({ msg: "请检查您的手机网络!", });
							} else {
								util.toast("请检查您的手机网络!");
							}
						} else {
							option.load && util.hideLoading();
							if (res.errMsg == "request:fail abort") {
								// 主动中断，不做处理
							} else {
								if (option.error) {
									option.error && option.error({ msg: "网络错误!", });
								} else {
									util.toast("网络错误!");
								}
							}
						}
					},
				});
			},
			complete: (res) => {
				uni.stopPullDownRefresh();
				if (option.feed) {
					util.feedbackGeneratorState();
				}
				option.done && option.done(res);
			},
			formData: option.data || {},
		};
		let requestTask = uni.request(opt);
		option.requestTask && option.requestTask(requestTask);
	},
	
	// 下载文件
	downloadFile(e) {
		let _this = this;
	
		// load变化回调
		if (e.loadCall) {
			e.loadCall({ type: "open", text: "开始下载.." });
		}
	
		// 是否打开load
		if (e.load) {
			util.showLoading();
		}
		
		let downloadTask = null;
		downloadTask = uni.downloadFile({
			url: e.url,
			timeout: 1000 * 60 * 60,
			header: e.header || _this.headers(),
			success: (res) => {
				downloadTask && downloadTask.offProgressUpdate();
				if (e.load) {
					util.hideLoading();
				}
				if (e.loadCall) {
					e.loadCall({type: "close" });
				}
	
				if (res.statusCode == 200) {
					e.success && e.success(res);
				} else {
					if (e.error) {
						e.error("下载失败，网络异常");
					} else {
						util.toast("下载失败，网络异常");
					}
				}
			},
			fail: (res) => {
				downloadTask && downloadTask.offProgressUpdate();
				if (e.load) {
					util.hideLoading();
				}
				if (e.loadCall) {
					e.loadCall({ type: "close" });
				}
				
				if (res.errMsg !== "downloadFile:fail abort") {
					if (e.error) {
						e.error("下载失败，网络异常");
					} else {
						util.toast("下载失败，网络异常");
					}
				}
			},
		});
	
		e.downloadTask && e.downloadTask(downloadTask);
		downloadTask && downloadTask.onProgressUpdate((res) => {
			// load变化回调
			if (e.loadCall) {
				e.loadCall({
					type: "open",
					text: `已下载${res.progress}%`,
				});
			}
			e.progress && e.progress(res);
		});
	},
	
	// 将文件上传到服务器
	uploadFile(e) {
		let _this = this;
	
		// load变化回调
		if (e.loadCall) {
			e.loadCall({ type: "open", text: "开始上传..", });
		}
	
		// 是否打开load
		if (e.load) {
			util.showLoading();
		}
		
		let header = e.header || _this.headers();
		delete header['Content-Type'];
		
		let uploadTask = null;
		let isOver = false;
		uploadTask = uni.uploadFile({
			url: config.api() + "/api/basis/upload",
			filePath: e.filePath,
			name: "file",
			formData: { type: e.type || "other" },
			timeout: 1000 * 60 * 10,
			header: header,
			success: (res) => {
				isOver = true;
				uploadTask && uploadTask.offProgressUpdate();
				if (e.load) {
					util.hideLoading();
				}
			
				if (e.loadCall) {
					e.loadCall({ type: "close" });
				}
			
				if (res.statusCode == 200) {
					let ret = JSON.parse(res.data);
					if (ret.code === 200) {
						e.success && e.success(ret);
					} else {
						if (e.error) {
							e.error(ret.msg);
						} else {
							util.toast(ret.msg);
						}
					}
				} else {
					if (e.error) {
						e.error("上传失败，网络异常");
					} else {
						util.toast("上传失败，网络异常");
					}
				}
			},
			fail: (res) => {
				isOver = true;
				uploadTask && uploadTask.offProgressUpdate();
				util.hideLoading();
				if (res.errMsg == "uploadFile:fail abort") {
					
				} else {
					if (e.error) {
						e.error("上传失败，网络异常");
					} else {
						util.toast("上传失败，网络异常");
					}
				}
			},
		});
			
		e.uploadTask && e.uploadTask(uploadTask);
		uploadTask && uploadTask.onProgressUpdate((res) => {
			if(isOver) return;
			// console.log(res);
			
			// load变化回调
			if (e.loadCall) {
				const progress = res.progress;
				e.loadCall({ type: "open", text: `当前已上传${progress}%` });
			}
			e.progress && e.progress(res);
		});
	},
	
};